/****************************************************************************
 *
 * MODULE:             DebugUnit.h
 * REVISION:           $Revision: $
 * DESCRIPTION
          2 wire UART and supprot for Debug commnication channel interrupt
 * CHANGE HISTORY:
 * LAST MODIFIED BY:   wzhting
 ****************************************************************************/


/****************************************************************************/
/***        Include files                                                 ***/
/****************************************************************************/
#include "Dbgu.h"
#include <string.h>
/****************************************************************************/
/***        Macro Definitions                                             ***/
/****************************************************************************/


/****************************************************************************/
/***        Type Definitions                                              ***/
/****************************************************************************/

/****************************************************************************/
/***        Local Function Prototypes                                     ***/
/****************************************************************************/

int  DbguDispatcher(DBGU* pDubg);
/****************************************************************************/
/***        Exported Variables                                            ***/
/****************************************************************************/

void DubgClearBufR(DBGU* pDubg)
{
    memset(pDubg->pDBGU_RBuf,'\0',DBGU_BUF_SZ_RECEIVE);
    pDubg->uDBGU_RcvCount = 0;
    pDubg->bDBGU_CmdNeedExec = FALSE;
}

void DbguInit(DBGU* pDubg,const DbguEntry* pLst)
{
    pDubg->pDbguLst = pLst;
    DubgClearBufR(pDubg);		  
}

void DubgExec(DBGU* pDubg)
{
    if(pDubg->bDBGU_CmdNeedExec == TRUE )
    {
//        uint8 i = 0;
//        for(;i<pDubg->uDBGU_RcvCount;i++)
//        {
//            if(pDubg->pDBGU_RBuf[i]>=0x61 && pDubg->pDBGU_RBuf[i]<=0x7A )
//              pDubg->pDBGU_RBuf[i]-=0x20;
//        }
         DbguDispatcher(pDubg );
         DubgClearBufR(pDubg);
    }

}

void DubgRxCallBack(DBGU* pDubg,uint8 ch)
{
   	if( pDubg->bDBGU_CmdNeedExec == FALSE )
	{	
		if(ch != '!' )
		{
			if( pDubg->uDBGU_RcvCount<DBGU_BUF_SZ_RECEIVE && pDubg->bDBGU_CmdNeedExec == FALSE)
			    pDubg->pDBGU_RBuf[pDubg->uDBGU_RcvCount++] = ch;
		}
		else
		{
			pDubg->bDBGU_CmdNeedExec = TRUE;
			return;
		}
	}
}

int DbguDispatcher(DBGU* pDubg)
{
    int i = 0;

    if(pDubg->pDbguLst!=NULL)
    {
        char* pCmdBuf = (char*)(pDubg->pDBGU_RBuf);
        i = 0;
        while(pDubg->pDbguLst[i].pCmd != NULL)
        {
            if(0 == strncasecmp(pCmdBuf,(const char*)pDubg->pDbguLst[i].pCmd,pDubg->pDbguLst[i].nCmdLegth) )
            {
                pDubg->pDbguLst[i].pFun((const char*)(pCmdBuf+pDubg->pDbguLst[i].nCmdLegth));
                return (i+1);
            }
            i++;
        };
    }
    return -1;
}


////////////////////////////////////////////////////////////////////////////


/****************************************************************************/
/***        END OF FILE                                                   ***/
/****************************************************************************/
